moduleRef.resolve() creates a new DI sub-context and instantiates the provider within it — required for REQUEST and TRANSIENT scoped providers. ContextIdFactory.create() generates a reusable context ID so that multiple resolve() calls can share the same scoped context and receive the same instance.
moduleRef.get() — synchronous, returns existing singleton, cannot resolve scoped providers.
moduleRef.resolve() — asynchronous, creates a new DI sub-context for scoped providers.
Each resolve() without a contextId creates a completely isolated context — fresh transient instances.
Pass the same contextId to multiple resolve() calls to share one scoped context across providers.